# 导入必要的模块
import tensorflow as tf
# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
from plotUtils import plot_result
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input

# 加载之前保存的HDF5格式模型
loaded_model = tf.keras.models.load_model('./tensorflow_pac/model/my_model.h5')

# # 方式2：
# # 或者加载SavedModel格式
#  loaded_model = tf.saved_model.load('my_model')

# # 方式3：
# # 如果模型结构与权重分开存储：
# # 加载模型结构
# json_file = open('my_model_architecture.json', 'r')
# loaded_model = tf.keras.models.model_from_json(json_file.read())
# json_file.close()
# # 加载权重
# loaded_model.load_weights('my_model_weights.h5')



# 确保重新编译模型（如果之前保存时没有包含优化器和损失信息）
loaded_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])


fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images2, test_labels2) = fashion_mnist.load_data()

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# #预览一下测试图片
# plt.figure(figsize=(10,10))
# for i in range(25):
#     plt.subplot(5,5,i+1)
#     plt.xticks([])
#     plt.yticks([])
#     plt.grid(False)
#     plt.imshow(train_images[i], cmap=plt.cm.binary)
#     plt.xlabel(class_names[train_labels[i]])
# plt.show()


# # #获取一个自导入图片进行类型测试
# # 加载一幅灰度图片
#img = Image.open('./assets/pu1.png').convert('L')  # convert('L') 将图像转换为灰度模式

img = image.load_img('./assets/pu4.png', target_size=(28, 28))
# 将图片转换为numpy数组，并进一步转换为float32类型
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)  # 添加批量维度

# 预处理，根据模型要求
img_array = preprocess_input(img_array)  # 对于ResNet50，这是归一化
if img_array.shape[-1] == 3:  # 检查是否为RGB图像     [r g b] [r g b] [r g b]  =>平铺开转换为灰度图片[像素1灰度值 像素2灰度值 像素3灰度值... ]
    gray_img_array = np.dot(img_array[..., :3], [0.2989, 0.5870, 0.1140])  # 使用ITU-R BT.601公式进行转换
else:
    print("The input array does not appear to be a RGB image.")

test_images = gray_img_array   # 归一化到0-1之间

# print(test_images)
test_labels=[1]  #标记一下我的图片是属于什么类型 参考class_names   画比对图会用到




# 进行预测
# 模型经过训练后，您可以使用它对一些图像进行预测。附加一个 Softmax 层，将模型的线性输出 logits 转换成更容易理解的概率。
probability_model = tf.keras.Sequential([loaded_model, 
                                         tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)


print(">>>>>>>>>>>>推测类型>>>>>>")
plot_result([0],predictions,test_labels,test_images,class_names)